package com.mdxq.gateway.filter;


import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @author WanJl
 * @version 1.0
 * @title AuthorizeFilter
 * @description 授权过滤器，这是我们自定义的一个过滤器，用来实现我们自己的业务逻辑
 * @create 2025/2/9
 */
@Order(-1)
/*
@Order(-1)是spring提供的一个主键，用来定义组件(bean、过滤器...)的执行顺序，
@Order注解可以作用在类级别上或方法级别上，如果作用在类级别，那么值越小，加载顺序越靠前。
 */
@Component
@Slf4j
public class AuthorizeFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("AuthorizeFilter........");
        //1、获取请求参数
        MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
        //2、获取Authorization参数
        String author = params.getFirst("authorization");
        //3、进行校验，验证成功则放行，失败则拦截
        if (author!=null&&author.equals("admin")){
            //4、放行
            return chain.filter(exchange);
        }
        //5、拦截
        //6、设置状态码，告诉它未经授权，禁止访问,HttpStatus.FORBIDDEN就是状态码403
        exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
        //7、结束处理
        return exchange.getResponse().setComplete();
    }
}
